#!/bin/sh
printf '\033[8;60;165t'
clear

#
# This script is refer to Pike R. Alpha's work as follow, also thanks to Pike R. Alpha.       by crazybirdy. v8.20190911
#

########################################################################################################################
# https://github.com/Piker-Alpha/HandyScripts/blob/master/installScriptTemplate.sh                                     #
# Bash script to download macOS High Sierra installation packages from sucatalog.gz and build the installer.pkg for it.#
# version 2.1 - Copyright (c) 2017 by Pike R. Alpha (PikeRAlpha@yahoo.com)                                             #
########################################################################################################################

printred() {
  printf "\e[1;31m${1}\e[0m"
}
printgreen() {
  printf "\e[1;32m${1}\e[0m"
}
printyellow() {
  printf "\e[1;33m${1}\e[0m"
}
printblue() {
  printf "\e[1;34m${1}\e[0m"
}
printpurple() {
  printf "\e[1;35m${1}\e[0m"
}
printLatest() {
  printf "\e[1;31m${1}\e[0m"
}
function headline()
{
  echo 
  printf "從 swscan.apple.com 下載完整安裝app.    Download the full installer app from swscan.apple.com.\n"
  echo 
}
function catalogselect()
{
  CatalogURLarray=(
  # CatalogURL for Regular Software Updates 10.13 10.14 10.16
  https://swscan.apple.com/content/catalogs/others/index-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz
  https://swscan.apple.com/content/catalogs/others/index-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz
  https://swscan.apple.com/content/catalogs/others/index-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz
  https://swscan.apple.com/content/catalogs/others/index-10.16-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog
  # CatalogURL for Public Beta Program Members 10.16
  https://swscan.apple.com/content/catalogs/others/index-10.16beta-10.16-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog
  #https://swscan.apple.com/content/catalogs/others/index-10.15beta-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz
  # CatalogURL for Developer Beta Program Members 10.16
  https://swscan.apple.com/content/catalogs/others/index-10.16seed-10.16-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog
  #https://swscan.apple.com/content/catalogs/others/index-10.15seed-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz
  # CatalogURL for Customer Seed Updates 10.16
  https://swscan.apple.com/content/catalogs/others/index-10.16customerseed-10.16-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog
  #https://swscan.apple.com/content/catalogs/others/index-10.15customerseed-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz
  )

  echo "正在搜尋完整安裝app，請耐心等候！ Searching for full installer app from catalogs of swscan.apple.com. Be patient!"
  echo 

  cd /private/tmp
  rm -f fullapp-*
  echo "new"> /private/tmp/fullapp-catalogs

  let index=0
  for element in "${CatalogURLarray[@]}"; do
    curl ${element} -o fullapp-catalogs-$index.gz 2>/dev/null
    found404=`cat fullapp-catalogs-$index.gz | grep Not | grep Found `
    if [[  $found404 == "" ]]; then
      gunzip fullapp-catalogs-$index.gz
    fi
    cat /private/tmp/fullapp-catalogs-$index >> /private/tmp/fullapp-catalogs
    let index++
  done
  rm -f /private/tmp/fullapp-catalogs-*
  catalogfile="/private/tmp/fullapp-catalogs"
}
function fullapparray()
{
	macOSdmgAllArray=`cat ${catalogfile} | grep BaseSystem.dmg | grep -v integrityData | sed 's/<string>//g' | sed 's/<\/string>//g' | awk '{print $1;}'`
	let index=0
	for element in "${macOSdmgAllArray[@]}"; do
		macOSdmgAAll[$index]="${element}"
		let index++
	done

	macOSdmgA=($(echo "${macOSdmgAAll[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))

	index=0
	for macOSdmglist in "${macOSdmgA[@]}"
	do
		if [[ ! $macOSdmglist == "" ]]; then
			macOSdmgpath=${macOSdmglist%%'BaseSystem.dmg'*}

			macOSUpdkey[$index]=`echo $macOSdmglist | sed 's/\// /g' | awk '{print $7;}' `
			macOSUpdkeydistribution[$index]=`echo ${macOSUpdkey[$index]} | sed 's/.\{9\}/& /g' | awk '{print $1;}' `

			url="${macOSdmgpath}"
			distribution="${macOSUpdkeydistribution[$index]}.English.dist"
			rm -f *dist

			curl $url$distribution -o ${macOSUpdkeydistribution[$index]}.English.dist 2>/dev/null
			macOSupdateosver[$index]=`cat ${macOSUpdkeydistribution[$index]}.English.dist | grep InstallAssistantAuto | grep version | awk '{print $4;}' | sed 's/version="//g' | sed 's/.\{7\}/& /g' | awk '{print $1;}' `
			macOSupdatebuildver[$index]=`cat ${macOSUpdkeydistribution[$index]}.English.dist | grep -A1 BUILD | grep -A1 key | grep string | sed 's/<string>//g' | sed 's/<\/string>//g' | awk '{print $1;}' `
			macOSupdatebeta[$index]=`cat ${macOSUpdkeydistribution[$index]}.English.dist | grep SU_TITLE | grep strings | grep macOS | grep Beta | sed 's/<strings language="English">"SU_TITLE" = "//g' | sed 's/";//g' | sed 's/Install //g' | sed 's/    //g' | sed 's/    //g' | sed 's/  //g' `
			rm -f *dist

			macOSupdatebuildver[$index]="${macOSupdateosver[$index]}.${macOSupdatebuildver[$index]}"

			macOSver=`echo ${macOSupdateosver[$index]} | sed 's/.\{5\}/& /g' | awk '{print $1;}' `
			if [[ ${macOSver} < 10.15 ]]; then
				if [[ ${macOSupdatebeta[$index]} == "" ]]; then
					macOSdmgBAll[$index]="${macOSupdatebuildver[$index]}=${macOSdmglist}"
					let index++
				fi 
			elif [[ ${macOSver} > 10.14 ]]; then
				macOSdmgBAll[$index]="${macOSupdatebuildver[$index]}=${macOSdmglist}"
				let index++
			fi
		fi
	done
	
	macOSdmgB=($(echo "${macOSdmgBAll[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))

	index=0
	for macOSdmglist in "${macOSdmgB[@]}"
	do
		if [[ ! $macOSdmglist == "" ]]; then
			macOSdmg[$index]=`echo $macOSdmglist | sed 's/=/ /g' | awk '{print $2;}' `
			let index++
		fi
	done
}
function fullapplist()
{
  index=0
  for macOSdmglist in "${macOSdmg[@]}"
  do
    if [[ ! $macOSdmglist == "" ]]; then
      macOSUpdver[$index]=`echo $macOSdmglist | sed 's/\// /g' | awk '{print $9;}' | sed 's/macOSUpd//g' | sed 's/.pkg//g' `
      macOSUpdversion1[$index]=`echo $macOSdmglist | sed 's/\// /g' | awk '{print $5;}' `
      macOSUpdversion2[$index]=`echo $macOSdmglist | sed 's/\// /g' | awk '{print $6;}' `
      macOSUpdversion[$index]="${macOSUpdversion1[$index]}/${macOSUpdversion2[$index]}"
      macOSUpdkey[$index]=`echo $macOSdmglist | sed 's/\// /g' | awk '{print $7;}' `
      macOSUpdkeydistribution[$index]=`echo ${macOSUpdkey[$index]} | sed 's/.\{9\}/& /g' | awk '{print $1;}' `
      macOSUpdsalt[$index]=`echo $macOSdmglist | sed 's/\// /g' | awk '{print $8;}' `

      url="https://swdist.apple.com/content/downloads/${macOSUpdversion[$index]}/${macOSUpdkey[$index]}/${macOSUpdsalt[$index]}/"
      distribution="${macOSUpdkeydistribution[$index]}.English.dist"
      rm -f *dist

      curl $url$distribution -o ${macOSUpdkeydistribution[$index]}.English.dist 2>/dev/null
      macOSupdateosver[$index]=`cat ${macOSUpdkeydistribution[$index]}.English.dist | grep InstallAssistantAuto | grep version | awk '{print $4;}' | sed 's/version="//g' | sed 's/.\{7\}/& /g' | awk '{print $1;}' `
      macOSupdatebeta[$index]=`cat ${macOSUpdkeydistribution[$index]}.English.dist | grep SU_TITLE | grep strings | grep macOS | sed 's/<strings language="English">"SU_TITLE" = "//g' | sed 's/";//g' | sed 's/Install //g' | sed 's/    //g' | sed 's/    //g' | sed 's/  //g' `
      macOSupdatebuildver[$index]=`cat ${macOSUpdkeydistribution[$index]}.English.dist | grep -A1 BUILD | grep -A1 key | grep string | sed 's/<string>//g' | sed 's/<\/string>//g' | awk '{print $1;}' `
      rm -f *dist

      macOSupdatebuildver[$index]="${macOSupdateosver[$index]}.${macOSupdatebuildver[$index]}"
      macOSuptime[$index]=`cat ${catalogfile} | grep -A 5 PostDate | grep -B 7 $url${macOSUpdkeydistribution[$index]} | grep \<date\> | sed 's/<date>//g' | sed 's/<\/date>//g' | awk '{print $1;}' | sed 's/T/ /g' | sed 's/Z//g' | awk NR==1 `
      macOSupdate[$index]="${macOSuptime[$index]} .. ${macOSUpdkeydistribution[$index]} .. ${macOSupdatebuildver[$index]} ${macOSupdatebeta[$index]}"
      macOSlist[$index]=`echo ${macOSdmglist} `
      let index++
    fi
  done

  index=0
  for list in "${macOSupdate[@]}"
  do
    echo "${macOSlist[$index]}"
    let index++
  done
}
function selectfullappversion()
{
  indexupdatever=0
  Latestupdatever=0
  for updatever in "${macOSupdatebuildver[@]}"
  do
    if [[ $updatever > $Latestupdatever ]]; then
      Latestupdatever=${macOSupdatebuildver[$indexupdatever]}
      Latestupdatebeta=${macOSupdatebeta[$indexupdatever]}
    fi
    let indexupdatever++
  done

  echo
  printf "最新版本 The latest version: \e[1;32m$Latestupdatever $Latestupdatebeta\e[0m\n"

  echo
  echo "可選擇下載的版本 Available version to downlaod:"
  echo

  indexmenu=0
  for updateselect in "${macOSupdate[@]}"
  do
    if [[ ${macOSupdatebuildver[$indexmenu]} == $Latestupdatever ]]; then
      printLatest "[ $indexmenu ] ${updateselect}"
      echo
    else
      echo "[ $indexmenu ] ${updateselect}"
    fi
    checkdownloadver[$indexmenu]=$indexmenu
    let indexmenu++
  done

  echo
  read -p "選擇要下載的版本 Select one version to downlaod: " downloadver
  if [[ ! $downloadver ]]; then
    echo
    echo "發生錯誤！！！                          Error!!!"
    echo
    echo "請選擇正確下載的版本。                  Please select right version to downlaod."
    echo
    rm -f ${catalogfile}
    exit 0
  fi

  checkfine=no
  checkindex=0
  for checkindex in "${checkdownloadver[@]}"
  do
    if [[ $downloadver == $checkindex ]]; then
      checkfine=yes
    fi
    let checkindex++
  done
  if [[ $checkfine == no ]]; then
    echo
    echo "發生錯誤！！！                          Error!!!"
    echo
    echo "請選擇正確下載的版本。                  Please select right version to downlaod."
    echo
    rm -f ${catalogfile}
    exit 0
  fi
}
function downloadfullapp()
{
  updatever="${macOSUpdver[$downloadver]}"
  version="${macOSUpdversion[$downloadver]}"
  key="${macOSUpdkey[$downloadver]}"
  salt="${macOSUpdsalt[$downloadver]}"
  echo "                                               [ $downloadver ] ${macOSupdate[$downloadver]}"

  distribution=`cat ${catalogfile} | grep "${version}" | grep "${key}" | grep "${salt}" | grep English | sed 's/<string>//g' | sed 's/<\/string>//g' | sed 's/\// /g' | awk '{print $9;}' `

    targetFiles[0]=`cat ${catalogfile} | grep "${version}" | grep "${key}" | grep "${salt}" | grep -v integrityData | grep InstallAssistantAuto.pkg | sed 's/<string>//g' | sed 's/<\/string>//g' | sed 's/\// /g' | awk '{print $9;}' | awk NR==1 `
    targetFiles[1]=`cat ${catalogfile} | grep "${version}" | grep "${key}" | grep "${salt}" | grep -v integrityData | grep AppleDiagnostics.chunklist | sed 's/<string>//g' | sed 's/<\/string>//g' | sed 's/\// /g' | awk '{print $9;}' | awk NR==1 `
    targetFiles[2]=`cat ${catalogfile} | grep "${version}" | grep "${key}" | grep "${salt}" | grep -v integrityData | grep AppleDiagnostics.dmg | sed 's/<string>//g' | sed 's/<\/string>//g' | sed 's/\// /g' | awk '{print $9;}' | awk NR==1 `
    targetFiles[3]=`cat ${catalogfile} | grep "${version}" | grep "${key}" | grep "${salt}" | grep -v integrityData | grep BaseSystem.chunklist | sed 's/<string>//g' | sed 's/<\/string>//g' | sed 's/\// /g' | awk '{print $9;}' | awk NR==1 `
    targetFiles[4]=`cat ${catalogfile} | grep "${version}" | grep "${key}" | grep "${salt}" | grep -v integrityData | grep BaseSystem.dmg | sed 's/<string>//g' | sed 's/<\/string>//g' | sed 's/\// /g' | awk '{print $9;}' | awk NR==1 `
    targetFiles[5]=`cat ${catalogfile} | grep "${version}" | grep "${key}" | grep "${salt}" | grep -v integrityData | grep InstallESDDmg.pkg | sed 's/<string>//g' | sed 's/<\/string>//g' | sed 's/\// /g' | awk '{print $9;}' | awk NR==1 `

  rm -f ${catalogfile}
  cd

  #
  # Initialisation of a variable (our target folder).
  #
  tmpDirectory="/private/tmp"

  #
  # URL copied from sucatalog.gz (think CatalogURL).
  #
  url="https://swdist.apple.com/content/downloads/${version}/${key}/${salt}/"

  #
  # Target distribution language.
  #
  keydistribution=`echo ${key} | sed 's/.\{9\}/& /g' | awk '{print $1;}' `
  distribution="${keydistribution}.English.dist"

  #
  # Check target directory.
  #
  if [[ -d "${tmpDirectory}/${key}" ]]; then
    rm -rf "${tmpDirectory}/${key}"
    mkdir "${tmpDirectory}/${key}"
  fi
  if [[ ! -d "${tmpDirectory}/${key}" ]]; then
    mkdir "${tmpDirectory}/${key}"
  fi
  open "${tmpDirectory}/${key}"

  echo 
  echo "準備進行下載。Prepare to download the files.   [ $downloadver ] ${macOSupdate[$downloadver]}."
  echo 
  echo "${url}${distribution}"
  for filename in "${targetFiles[@]}"
  do
    if [[ ! $filename == "" ]]; then
      echo "${url}$filename"
    fi
  done
  echo

  printred "如果你已經發生下載錯誤，可以 預先手動下載 上列網址文件，並將文件放入 以下 正確的文件夾 即可繼續進行。\n"
  printred "If get errors of downloading before, you can download files as above URL manually and put into correct folder as below before continuing.\n"
  echo

  echo "${tmpDirectory}/${key}/${distribution}"
  for filename in "${targetFiles[@]}"
  do
    if [[ ! $filename == "" ]]; then
      echo "${tmpDirectory}/${key}/$filename"
    fi
  done
  echo

  read -p "手動下載放入上列文件，或由腳本自動下載文件，繼續進行？   Put files as above manually or download files automatically, continue? (y/n) " downloadyesno
  case "$downloadyesno" in
    y|Y)
      echo
    ;;
    *)
      echo
      echo "停止進行下載！！！               Stop downloading!!!"
      echo
      exit 0
    ;;
  esac

  #
  # Download distribution file.
  #
  if [[ ! -e "${tmpDirectory}/${key}/${distribution}" ]]; then
    echo "Downloading: ${distribution} ..."
    axel -n 16 -q "${url}${distribution}" -o "${tmpDirectory}/${key}/${distribution}"
    #
    # Remove root only restriction/allow us to install on any target volume.
    #
    cat "${tmpDirectory}/${key}/${distribution}" | sed -e 's|rootVolumeOnly="true"|allow-external-scripts="true"|' > "${tmpDirectory}/${key}/new.dist"

    if [[ -e "${tmpDirectory}/${key}/new.dist" ]]; then
      mv "${tmpDirectory}/${key}/new.dist" "${tmpDirectory}/${key}/${distribution}"
    fi
  else
    echo "File: ${distribution} already there, skipping this download."
  fi

  #
  # Change to working directory (otherwise it will fail to locate the packages).
  #
  cd "${tmpDirectory}/${key}"

  #
  # Download target files.
  #
  for filename in "${targetFiles[@]}"
  do
    if [[ ! $filename == "" ]]; then
      if [[ ! -e "${tmpDirectory}/${key}/${filename}" ]]; then
        echo "Downloading: ${filename} ..."
        axel -n 16 -a "${url}${filename}" -o "${tmpDirectory}/${key}/${filename}"
      else
        echo "File: ${filename} already there, skipping this download."
      fi
    fi
  done

  pkgutil --expand-full InstallAssistantAuto.pkg Installapp

  cd "${tmpDirectory}/${key}/Installapp/Payload/"
  fullappnames=(*)

  echo
  echo "找到 Found ...... ${fullappnames}"
  echo

  for appname in "${fullappnames[@]}"
  do
        if [[ -e "${tmpDirectory}/${key}/Installapp/Payload/${appname}/Contents/SharedSupport/" ]]; then
          mv "${tmpDirectory}/${key}/AppleDiagnostics.chunklist" "${tmpDirectory}/${key}/Installapp/Payload/${appname}/Contents/SharedSupport/"
          mv "${tmpDirectory}/${key}/AppleDiagnostics.dmg" "${tmpDirectory}/${key}/Installapp/Payload/${appname}/Contents/SharedSupport/"
          mv "${tmpDirectory}/${key}/BaseSystem.chunklist" "${tmpDirectory}/${key}/Installapp/Payload/${appname}/Contents/SharedSupport/"
          mv "${tmpDirectory}/${key}/BaseSystem.dmg" "${tmpDirectory}/${key}/Installapp/Payload/${appname}/Contents/SharedSupport/"
          mv "${tmpDirectory}/${key}/InstallESDDmg.pkg" "${tmpDirectory}/${key}/Installapp/Payload/${appname}/Contents/SharedSupport/InstallESD.dmg"
          rm -rf "$HOME/Desktop/App-${macOSupdatebuildver[$downloadver]}"
          mkdir -p "$HOME/Desktop/App-${macOSupdatebuildver[$downloadver]}"
          mv "${tmpDirectory}/${key}/Installapp/Payload/${appname}" "$HOME/Desktop/App-${macOSupdatebuildver[$downloadver]}/"
          newappname="${appname}"
        fi
  done

  echo "$HOME/Desktop/App-${macOSupdatebuildver[$downloadver]}/"
  ls -la "$HOME/Desktop/App-${macOSupdatebuildver[$downloadver]}/"
  echo
  echo "$HOME/Desktop/App-${macOSupdatebuildver[$downloadver]}/${newappname}/Contents/SharedSupport/"
  ls -la "$HOME/Desktop/App-${macOSupdatebuildver[$downloadver]}/${newappname}/Contents/SharedSupport/"
  open "$HOME/Desktop/App-${macOSupdatebuildver[$downloadver]}/"

  echo
  echo "完整安裝app 存放在 $HOME/Desktop/App-${macOSupdatebuildver[$downloadver]}/"
  echo "The full installer app is located on $HOME/Desktop/App-${macOSupdatebuildver[$downloadver]}/"
  echo
  printf "\e[1;34mMake sure you get the full installer without any errors during the downloading process.\e[0m\n"
  printf "\e[1;34m1.check the received sizes of each file, make sure they’re all 100 downloaded.\e[0m\n"
  printf "\e[1;34m2.if any one of the files \e[0m\e[1;31mgets error\e[0m\e[1;34m during the downloading process,\e[0m\n"
  printf "\e[1;34m  and\e[0m \e[1;31mdidn’t get 100 downloaded,\e[0m\e[1;34m you\e[0m \e[1;31mneed to re-download the full installer app again.\e[0m\n"
  echo
  if [[ -d "${tmpDirectory}/${key}" ]]; then
    rm -rf "${tmpDirectory}/${key}"
  fi
}
function main()
{
  headline
  catalogselect
  fullapparray
  fullapplist
  selectfullappversion
  downloadfullapp
}

main

exit 0